/* eslint-disable no-unused-vars */
/* eslint-disable no-unused-expressions */
import Vue from 'vue'
import swal from 'sweetalert2'
import router from '../router'
import axios from 'axios'
import qs from 'qs'
import NProgress from 'nprogress'
import cookie from 'js-cookie'
import {
  Notification,
  Loading,
  Message
} from 'element-ui'
// 样式文件，需单独引入
import 'element-ui/lib/theme-chalk/index.css'
Vue.prototype.$http = axios
Vue.prototype.$notifynotify = Notification
Vue.prototype.$loading = Loading
Vue.prototype.$message = Message
Vue.prototype.$swal = swal
Vue.prototype.$qs = qs

// 环境设置
// 环境的切换
let BaseUrl
console.log(process.env.NODE_ENV)
if (process.env.NODE_ENV === 'development') {
  BaseUrl = 'http://127.0.0.1:8000'
} else if (process.env.NODE_ENV === 'test') {
  BaseUrl = ''
} else if (process.env.NODE_ENV === 'production') {
  BaseUrl = ''
}

localStorage.BaseUrl = BaseUrl
axios.defaults.baseURL = BaseUrl
// axios.defaults.headers.post["Content-Type"] =
//     "application/json";
// axios.defaults.headers.post['XX-Token'] = '';

// 设置请求超时
axios.defaults.timeout = 900000
// 请求拦截
// 先导入vuex,因为我们要使用到里面的状态对象
// vuex的路径根据自己的路径去写
// import store from '@/store/index';

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断vuex中是否存在token
    // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    // const token = store.state.token;
    const token = localStorage.getItem('token')
    // const token = '123qweasd'
    token && (config.headers.authToken = token)
    return config
  },
  error => {
    return Promise.error(error)
  }
)
// 响应拦截器
axios.interceptors.response.use(
  response => {
    // debugger
    // 进入这里, 说明返回的状态码是200
    NProgress.done()
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误
    if (response.data.code === 0) {
      return Promise.resolve(response)
    } else if (response.data.code === 1) {
      swal({
        type: 'error',
        text: response.data.msg
      })
      return Promise.resolve(response)
    } else {
      switch (response.data.code) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 5:
          Notification.error({
            title: '错误',
            message: response.data.msg,
            duration: 1500
          })
          router.push({
            path: '/login'
          })
          break

        default:
          Notification.error({
            title: '错误',
            message: response.data.msg,
            duration: 1500
          })
      }
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  // 下面列举几个常见的操作，其他需求可自行扩展
  error => {
    // 如果进入这里, 说明不是响应状态码不是2xx
    NProgress.done()
    console.log(error.response)
    var response = error.response
    switch (response.status) {
      // error.response.status  响应码
      case 400:
      case 401:
      case 402:
      case 403:
      case 404:
        Notification.error({
          title: '页面没找到',
          message: response.data.message,
          duration: 1500
        })
        break
      case 500:
        Notification.error({
          title: '服务器内部错误 500',
          message: response.data.message,
          duration: 1500
        })
        // router.push({
        //   path: '/login'
        // })
        break

      default:
        Notification.error({
          title: '错误',
          message: response.data.ResultMsg,
          duration: 1500
        })
    }
    return Promise.reject(response)
  }
)

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
  NProgress.start()
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        resolve(res.data.ResultObj)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 **/
export function post(url, params, headers) {
  // debugger
  var p = ''
  if (headers && headers.headers && headers.headers['Content-Type'] === 'application/json;') {
    p = params
  } else {
    p = qs.stringify(Object.assign({}, params))
  }
  return new Promise((resolve, reject) => {
    axios
      .post(url, p, headers)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

export function uploadFile(Url, data) {
  // 上传图片的方法
  return new Promise((resolve, reject) => {
    const instance = axios.create({
      baseURL: '',
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
    instance
      .post(Url, data)
      .then(res => {
        resolve(res.data.data)
      })
      .catch(error => {
        reject(error.data)
      })
  })
}
